package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

func main() {
	c := make(chan int, 4)
	v := reflect.ValueOf(c)
	//直接使用Value.Int ,Bool等方法进行类型转换，但失败是会引发panic，且不支持ok-idiom
	if v.TrySend(reflect.ValueOf(100)) {
		fmt.Println(v.TryRecv())
	}
	//接口有两种nil状态，这一直是一个潜在的麻烦。解决方法是使用isNil判断值是否为nil
	var a interface{} = nil
	var b interface{} = (*int)(nil)
	fmt.Println("---------------------------")
	fmt.Println(a == nil)
	fmt.Println(b == nil, reflect.ValueOf(b).IsNil())

	//也可以直接使用unsafe转换后直接判断iface.data是否为零值
	fmt.Println("---------------------------")
	iface := (*[2]uintptr)(unsafe.Pointer(&b))
	fmt.Println(iface,iface[1]==0)
	//Value里的某些方法并未实现ok-idom或者error，所以得自行判断返回的是否为Zero Value 。
	fmt.Println("---------------------------")
	v2 := reflect.ValueOf(struct {
		name string
	}{})
	println(v2.FieldByName("name").IsValid())
	println(v2.FieldByName("xxx").IsValid())
}
